//memmove()函数的使用。 void * memmove ( void * destination, const void * source, size_t num );
//和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
//如果源空间和⽬标空间出现重叠，就得使⽤memmove函数处理。

//memmove()的使用
//#include<stdio.h>
//#include<string.h>
//#include<assert.h>

//不复制重叠的情况
//void* my_memcpy(void* destination,void* source,size_t num)
//{
//    //由于拷贝，所以先断言
//    assert(destination&&source);
//    void* ret=destination;
//    while(num--)
//    {
//        //由于不知传过来的类型是什么，而这函数是以字节为单位拷贝，所以把类型强制转换为char* ,以1个单位来访问更方便
//        *(char*)destination=*(char*)source;
//        source=(char*)source+1;
//        destination=(char*)destination+1;
//    }
//    return ret;
//}

//int main()
//{
//    int arr1[]={1,2,3,4,5,6,7,8,9,10};
//    //在同一个数组中实现移动数据
//    memmove(arr1+2,arr1,20);
//    for(int i=0;i<10;i++)
//    {
//        printf("%d ",arr1[i]);
//    }
//    printf("\n");
//    return 0;
//}


////模拟实现my_memmove()
//#include<stdio.h>
//#include<assert.h>
//void* my_memmove(void* destinstion,const void* source,size_t num)
//{
//    assert(destinstion&&source);
//    void* ret=destinstion;
//     if(destinstion<source)
//     {
//        while(num--)
//        {
//            *(char*)destinstion=*(char*)source;
//            destinstion=(char*)destinstion+1;
//            source=(char*)source+1;
//        }
//     }
//     else
//     {
//        while(num--)
//        {
//            *((char*)destinstion+num)=*((char*)source+num);
//        }
//     }
//    return ret;
//}

//int main()
//{
//    int arr1[]={1,2,3,4,5,6,7,8,9,10};
//    my_memmove(arr1+2,arr1,20);
//    for(int i=0;i<10;i++)
//    {
//        printf("%d ",arr1[i]);
//    }
//    printf("\n");
//    int arr2[]={1,2,3,4,5,6,7,8,9,10};
//    my_memmove(arr2,arr2+2,20);
//    for(int i=0;i<10;i++)
//    {
//        printf("%d ",arr2[i]);
//    }
//    printf("\n");
//    return 0;
//}
